import re

import pytest
from playwright.sync_api import expect


# conftest.py 中定义的夹具默认是局部的，只会自动引用到同一目录下的测试文件中

@pytest.fixture(autouse=True)
def global_setup_and_teardown():
    # 这个夹具会在每个测试用例之前自动运行
    print("进行全局设置")

    yield  # 这是一个特殊的yield语句，用于标志夹具的结束

    # 这个夹具会在每个测试用例之后自动运行
    print("进行全局清理")


# session级别，全局仅运行一次，autouse=True 自动启用，它会在所以用例之前自动执行
@pytest.fixture(scope='session', autouse=True)
def test_login(browser,base_url) -> None:
    print("用户登录")
    username = "admin"
    password = "123456"
    context=browser.new_context(base_url=base_url)
    page=context.new_page()
    page.goto(base_url+"/xxl-job-admin/toLogin")
    page.get_by_placeholder("请输入登录账号").fill(username)
    page.get_by_placeholder("请输入登录密码").fill(password)
    with page.expect_navigation(url="**/xxl-job-admin/"):
        page.get_by_role("button", name="登录").click()
    # 保存cookie，注意auth目录不会自动创建，这是相对路径，是根据当前代码所在路径的下面创建
    context.storage_state(path="auth/login.json")
    expect(page).to_have_url(re.compile(".*/xxl-job-admin/"))


@pytest.fixture(scope="session", autouse=True)
def browser_context_args(browser_context_args):
    """
    添加context 上下文参数，默认每个页面加载cookies
    :param browser_context_args:
    :return:
    """
    return {"storage_state":"auth/login.json",**browser_context_args}